Injection SQL
Imaginez un formulaire HTML.Par exemple un formulaire de connexion.
L'utlisateur peut saisir deux champs; identifiant et mot de passe.
Le serveur reçoit ces données et interroge la base pour voir si cet utilisateur existe:
<?php $nom = $_POST["nom"]; $prenom = $_POST["prenom"]; $requete = "SELECT id FROM users WHERE nom='$nom' AND prenom='$prenom';" ?>Exemple s'il a saisi comme identifiant Joe et mot de passe mon mot de passe
PHP met la valeur de ce qu'il a saisi et la requête SQL envoyée au SGBD sera:
SELECT id FROM users WHERE nom='JOE' AND mdp='mon mot de passe';Or, si un enfoiré n'a pas saisi son nom, mais a saisi
';TRUNCATE TABLE USERS;
Alors la requête SQL envoyée au SGBD sera:
SELECT id FROM users WHERE nom='';TRUNCATE TABLE USERS;' AND mdp='mon mot de passe';Le SGBD va parser la requête, au point virgule remarquer qu'il y a 3 requêtes SQL,
il va ensuite tenter d'exécuter la 1re requête: elle va planter, mais ce n'est pas grave.
Ce qui est grave c'est qu'ensuite le SGBD va exécuter la seconde requête,
et celle-là ne va pas planter. Elle va vider la table des utilisateurs.
C'est ça l'injection SQL.
Comment se protéger?
Nettoyer les données entrantes provenant de formulaires.
La fonction PHP addslashes() remplacera un antislash avant les apostrophes.
Dans ce cas la requête avec tentative d'injection sera
SELECT id FROM users WHERE nom='\';TRUNCATE TABLE USERS;' AND mdp='mon mot de passe';Le nom qui sera passé au SGBD sera
\';TRUNCATE TABLE USERS;'
Ainsi la requête fonctionnera et ne retournera aucun enregistrement car cet utilisateur n'existe pas,
en ayant toutefois déjoué la tentative d'injection SQL.